package com.example.userservice.controller;

import cn.hutool.jwt.JWTUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.common.AppVariable;
import com.example.common.PasswordUtil;
import com.example.common.Result;
import com.example.userservice.entity.Userinfo;
import com.example.userservice.entity.vo.UserinfoVO;
import com.example.userservice.service.UserService;
import com.example.userservice.utils.MyJWTUtils;
import jakarta.annotation.Resource;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;


/**
 * @Description: TODO
 * @Author Mr.Tang
 */

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private UserService userService;

    @PostMapping("/add")
    public Result add(Userinfo userInfo) {
        // 1. 非空判断
        if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||
                !StringUtils.hasLength(userInfo.getPassword())) {
            return Result.fail(-1, "非法参数");
        }
        // 密码加盐处理
        userInfo.setPassword(PasswordUtil.encrypt(userInfo.getPassword()));

        // 2. 调用service进行处理
        boolean result = userService.save(userInfo);

        // 3. 将结果返回给调用方
        if (!result) {
            return Result.fail(-1, "注册失败");
        }
        return Result.success("注册成功!");
    }

    @PostMapping("/login")
    public Result login(String username, String password) {
        // 1. 非空判断
        if (!StringUtils.hasLength(username) || !StringUtils.hasLength(password)) {
            return Result.fail(-1, "非法参数");
        }

        // 2. 根据 [用户名] 查询数据库中的 UserInfo 对象
        Userinfo user = userService.getOne(new QueryWrapper<Userinfo>().eq("username", username));
        if (user == null || user.getUid() <= 0) {
            // 根据用户名查询失败
            return Result.fail(-1, "用户名或密码输入错误");
        }

        // 3. 进行密码的比较
        if (!PasswordUtil.decrypt(password, user.getPassword())) {
            // 密码比对失败
            return Result.fail(-1, "用户名或密码输入错误");
        }

        // 4. 登录成功, 使用 JWT 生成 Token
        Map<String, Object> payload = new HashMap<>() {
            private static final long serialVersionUID = 1L;
            {
                put("uid", user.getUid());
                put("manager", user.getManager());
                // JWT 过期时间为 24 小时
                put("exp", System.currentTimeMillis() + 1000 * 60 * 60 * 24);
            }
        };
        String token = JWTUtil.createToken(payload, AppVariable.JWT_PRIVATE_KEY.getBytes());   // 生成token

        HashMap<String, Object> result = new HashMap<>(){{
            put("token", token);
            put("uid", user.getUid());
            put("username", user.getUsername());
            put("manager", user.getManager());
        }};

        // 成功返回
        return Result.success(result);
    }


    @GetMapping("/getByUid")
    public Result getByUid(Long uid,
                           @RequestHeader(value = AppVariable.TOKEN_KEY, required = false) String token) {
        // 1. 校验参数
        if (uid == null || uid <= 0) {
            return Result.fail(-1, "非法参数");
        }
        // 2. 根据 uid 查询用户信息
        Userinfo userinfo = userService.getById(uid);
        if (userinfo == null || userinfo.getUid() <= 0) {
            return Result.fail(-2, "用户状态参数");
        }
        // 3. 将登录用户 id 复制给结果对象
        Long loginUid = MyJWTUtils.getUidByToken(token);
        UserinfoVO userinfoVO = new UserinfoVO();
        userinfoVO.setUid(userinfo.getUid());
        userinfoVO.setUsername(userinfo.getUsername());
        userinfoVO.setEmail(userinfo.getEmail());
        userinfoVO.setLoginUid(loginUid);
        // 4. 将结果对象返回给调用者
        return Result.success(userinfoVO);
    }


    /**
     * 提供给 article-service 调用的方法
     * @return
     */
    @GetMapping("/getNameByUid")
    public String getNameByUid(Long uid) {
        if (uid == null || uid <= 0) {
            return "";
        }
        Userinfo userinfo = userService.getById(uid);
        if (userinfo == null || userinfo.getUid() <= 0) {
            return "";
        }
        return userinfo.getUsername();
    }



}
